package com.xzr.demo.mqserver.core;

import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * 传递的消息
 * 消息 ： 还需要具有 序列化和 反序列 。
 * Message 存储的是 二进制数据。 使用 标准库自带的方式进行序列化反序列化
 * @Author：徐志荣
 * @Date：2023/8/3 下午 4:45
 */
@Data
public class Message implements Serializable {
    //可选
    //验证版本
    private static final long serialVersionUID = 1L;

    //核心 部分
    private BasicProperties basicProperties = new BasicProperties();
    private byte[] body;

    //辅助部分
    //Message 后续会存储到文件中
    //一个文件中会存储很多消息
    //根据偏移量：进行表示具体的偏移量 【offsetBeg，offsetEnd）
    //这两个字段不需要序列化
    private transient long offsetBeg = 0; //根据文件开头为起点
    private transient long offsetEnd = 0;

    //该消息是否是有效的？ （如果删除，就使用逻辑删除）
    //0x1 ：有效 ； 0x0 ： 无效
    private byte isValid = 0x1;

    //创建一个工厂方法，让工厂方法 帮我们封装一下 Message 对象的过程
    public static Message createMessageWithId(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();
        if(basicProperties!=null){
            message.setBasicProperties(basicProperties);
        }
        //M- 作为前缀
        message.setMessageId("M-"+UUID.randomUUID());
        //万一， routingKey 和 basicProperties里的routingKey冲突，以外面的为主
        message.basicProperties.setRoutingKey(routingKey);
        message.body = body;
        //目前 设置 message 的核心部分
        return  message;
    }

    public String getMessageId(){
        return basicProperties.getMessageId();
    }
    public void setMessageId(String messageId){
        basicProperties.setMessageId(messageId);
    }

    public String getRoutingKey(){
        return basicProperties.getRoutingKey();
    }
    public void setRoutingKey(String routingKey){
        basicProperties.setRoutingKey(routingKey);
    }
    public int getDeliverMode(){
        return basicProperties.getDeliverMode();
    }
    public void setDeliverMode(int mode){
        basicProperties.setDeliverMode(mode);
    }
}
